/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package matematicadiscretaxml;

import arbol_prueba.BTree;
import java.util.ArrayList;

/**
 *
 * @author diego
 */
public class Eliminacion {
 
    private ArrayList lista_lexemas = new ArrayList();

    ObjetoQuery tabla_obj_query[][] = new ObjetoQuery[0][0];//TABLA QUE RESULTA DEL PRODUCTO CARTESIANO
    ObjetoQuery vector_select[] = new ObjetoQuery[0];//VECTOR DE CAMPOS DEL SELECT
    ArrayList lista_errores_eliminacion = new ArrayList();//GUARDA LOS ERRORES
//    ArrayList<ObjetoQuery> lista_valores_actualizar = new ArrayList();//GUARDA LOS ERRORES

    OperacionesArchivoXML obj_opera_en_xml = new OperacionesArchivoXML();

    ArrayList<DefinicionTabla> lista_def_columnas = new ArrayList();/* AQUI SE GUARDA LAS COLUMNAS QUE DEFINEN LA TABLA */

    public Eliminacion(){}

    public Eliminacion(ArrayList _lista_lexemas)
    {
        lista_lexemas = _lista_lexemas;
    }

    public void generarArbolSintacticoEliminacion()
    {
        Delete obj_delete = new Delete(lista_lexemas);
        From_Delete obj_from_delete = new From_Delete(lista_lexemas);
        Where obj_where = new Where(lista_lexemas);
        BTree sub_arbol_from_delete = null;
        BTree sub_arbol_where = null;
        BTree sub_arbol_delete = null;

        
        obj_delete.ingresarPilas();
        sub_arbol_delete = obj_delete.generarSubArbolDelete(new BTree("nulo"));
        lista_errores_eliminacion.addAll(obj_delete.getlista_errores_delete());

        if(lista_errores_eliminacion.isEmpty())
        {
            sub_arbol_delete.imprimePostOrden();

            System.out.println("**************************************************************");
            obj_from_delete.ingresarPilas();
            sub_arbol_from_delete = obj_from_delete.generarSubArbolFromDelete(new BTree("nulo"));
            lista_errores_eliminacion.addAll(obj_from_delete.getlista_errores_from_delete());

            if(lista_errores_eliminacion.isEmpty())
            {
                sub_arbol_from_delete.imprimePostOrden();

                System.out.println("**************************************************************");
                obj_where.ingresarPilas();
                if(!obj_where.pila_pal_reserv.empty())
                {
                    sub_arbol_where = obj_where.generarSubArbolWhere(new BTree("nulo"));
                    lista_errores_eliminacion.addAll(obj_where.getLista_errores_where());
                    if(lista_errores_eliminacion.isEmpty())
                    {
                        sub_arbol_where.imprimePostOrden();
                        if(lista_errores_eliminacion.isEmpty())
                        {
                            ejecutarDelete(sub_arbol_delete, sub_arbol_from_delete, sub_arbol_where);
                        }
                    }
                }
                else
                {
                    ejecutarDelete(sub_arbol_delete, sub_arbol_from_delete, null);
                }
            }
        }
    }

    public void ejecutarDelete(BTree sub_arbol_delete, BTree sub_arbol_from_delete, BTree sub_arbol_where)
    {
        recorrerSubArbolDelete(sub_arbol_delete);
        if(lista_errores_eliminacion.isEmpty())
        {
            recorrerSubArbolFromDelete(sub_arbol_from_delete);
        }
        if(lista_errores_eliminacion.isEmpty())
        {
            if(sub_arbol_where != null)
            {
                recorrerSubArbolWhere(sub_arbol_where, sub_arbol_from_delete);
            }
            if(lista_errores_eliminacion.isEmpty())
            {
                lista_errores_eliminacion.addAll(obj_opera_en_xml.verificarIntegridadReferencial(tabla_obj_query));

                if(lista_errores_eliminacion.isEmpty())
                {
                    if(tabla_obj_query.length != 0)
                    {
                        XML obj_xml = new XML("archivos_usados/archivos_base_datos/archivos_datos/"+
                            tabla_obj_query[0][0].getTabla().toLowerCase() +"_dat.xml");
                            obj_xml.eliminarRegistroXML(tabla_obj_query);

                        imprimirMatriz(tabla_obj_query);

                        for(int i = 0; i<lista_def_columnas.size(); i++)
                        {
                            System.out.println(lista_def_columnas.get(i).getNombre_tabla()
                                                +" | "+lista_def_columnas.get(i).getNombre()
                                                +" | "+lista_def_columnas.get(i).getTipo_dato()
                                                +" | "+lista_def_columnas.get(i).getPrimaria()
                                                +" | "+lista_def_columnas.get(i).getForanea()
                                                +" | "+lista_def_columnas.get(i).getTabla_referencia());
                        }
                        System.out.println("TODO BIEN !!! ");
                    }
                    
                }
                else
                {
                    System.out.println("fallo referencial");
                    tabla_obj_query = new ObjetoQuery[0][0];
                }
            }
            else
            {
                tabla_obj_query = new ObjetoQuery[0][0];
            }
        }
        else
        {
            tabla_obj_query = new ObjetoQuery[0][0];
        }
    }

    public void imprimirMatriz(ObjetoQuery[][] matriz)
    {
        System.out.println("*************** ELIMINACION *****************");
        for(int i = 0; i<matriz.length; i++)
        {
            for(int j = 0; j<matriz[0].length; j++)
            {
                System.out.print(matriz[i][j].getObjeto()+" | ");
            }
            System.out.println("");
        }
        System.out.println("*********************************************");
    }

    public void recorrerSubArbolDelete(BTree nodo)
    {
        if( nodo.getIzquierda()!= null )
        {
            recorrerSubArbolDelete(nodo.getIzquierda());
        }
        if(nodo.getDerecha() != null)
        {
            recorrerSubArbolDelete(nodo.getDerecha());
        }
        if( !(   ((Lexema)nodo.getElement()).getTipo_lexema() == 1
            && ((Lexema)nodo.getElement()).getLexema().toLowerCase().equals("delete")
            && ((Lexema)nodo.getDerecha().getElement()).getLexema() == null
            && ((Lexema)nodo.getIzquierda().getElement()).getLexema() == null ))
        {
            if(((Lexema)nodo.getElement()).getLexema() != null)
            {
                System.out.println("------------------------>ENTRA AQUI");
                lista_errores_eliminacion.add(new Error("BLOQUE DELETE", "NO COMIENZA CON LA PALABRA DELETE"));
            }

        }
    }

    public void recorrerSubArbolWhere(BTree nodo, BTree nodo_update )
    {
        if( nodo.getIzquierda()!= null )
        {
            recorrerSubArbolWhere(nodo.getIzquierda(), nodo_update);
        }
        if(nodo.getDerecha() != null)
        {
            recorrerSubArbolWhere(nodo.getDerecha(), nodo_update);
        }

        if( ((Lexema)nodo.getElement()).getTipo_lexema() == 4 )
        {
            int num_repitencias = 0;
            switch(buscarPuntoCadena(((Lexema)nodo.getElement()).getLexema()))
            {
                case 0:
                    num_repitencias = obj_opera_en_xml.buscarCamposEnArbol(nodo_update, ((Lexema)nodo.getElement()).getLexema());

                    if(num_repitencias > 1 )
                    {
                        lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN DELETE"));
                    }
                    else if(num_repitencias == 0)
                    {
                        lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN DELETE"));
                    }
                    break;

                case 1:
                    String tabla_campo = ((Lexema)nodo.getElement()).getLexema();
//                    System.out.println("PARTE TABLA"+tabla_campo.substring(0, tabla_campo.indexOf('.')));
//                    System.out.println("PARTE CAMPO"+tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() ));
                    num_repitencias = obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo.substring(tabla_campo.indexOf('.')+1,tabla_campo.length())
                                                                            , tabla_campo.substring(0, tabla_campo.indexOf('.')));

                    if(num_repitencias == 0)
                    {
                        lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN DELETE"));
                    }
                    break;

                default:
                    lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "UN IDENTIFICADOR EN WHERE DEBE TENER A LO MAS UN PUNTO"));
                    break;
            }
        }
        else if(((Lexema)nodo.getElement()).getTipo_lexema() == 5)
        {
            /*
             * ACA NO SE HACE NADA PS ES CONSTANTE CADENA
             */
        }
        else if(((Lexema)nodo.getElement()).getTipo_lexema() == 6)
        {
            /*
             * ACA NO SE HACE NADA PS ES CONSTANTE NUMERO
             */
        }
        else if(((Lexema)nodo.getElement()).getTipo_lexema() == 3)
        {
            if(nodo.getDerecha() != null && nodo.getIzquierda() != null)
            {
                String tabla_campo = "";

                if( (((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 4
                        && ((Lexema)nodo.getDerecha().getElement()).getTipo_lexema() == 5)
                     || (((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 5
                        && ((Lexema)nodo.getDerecha().getElement()).getTipo_lexema() == 4)
                        )
                {
                /*
                 * NOTA: ACA SE DEBE VERIFICAR SI EL CAMPO ES UNA CADENA
                 */
                    String nombre_tabla_ident = null;
                    String nombre_campo_ident = null;
                    String const_cad = null;

                    if( ((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 4 )
                    {
                        tabla_campo = ((Lexema)nodo.getIzquierda().getElement()).getLexema();
                        const_cad = ((Lexema)nodo.getDerecha().getElement()).getLexema().replace("'", "");

                    }
                    else
                    {
                        tabla_campo = ((Lexema)nodo.getDerecha().getElement()).getLexema();
                        const_cad = ((Lexema)nodo.getIzquierda().getElement()).getLexema().replace("'", "");
                    }

                    if( buscarPuntoCadena(tabla_campo) == 0 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo) == 1)
                        {
                            String nombre_tabla = obj_opera_en_xml.buscarTablaDeCampo(nodo_update, tabla_campo);

                            if( !nombre_tabla.equals("") )
                            {
                                String tipo_dato_campo = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);
                                
                                if( tipo_dato_campo.equals("varchar") )
                                {
                                    nombre_tabla_ident = nombre_tabla;
                                    nombre_campo_ident = tabla_campo;
                                }
                                else
                                {
                                    lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "LOS TIPOS DE DATOS NO CORRESPONDEN"));
                                }
                            }
                            else
                            {
//                                System.out.println("-----------------ESTA AQUI");
                                lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN DELETE"));
                            }
                        }
                        else
                        {
                            lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN DELETE O EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN DELETE"));
                        }
                    }
                    else if( buscarPuntoCadena(tabla_campo) == 1 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                    , tabla_campo.substring(0, tabla_campo.indexOf('.'))) == 1)
                        {
                            String nombre_tabla = tabla_campo.substring(0, tabla_campo.indexOf('.'));
                            
                            if( !nombre_tabla.equals("") )
                            {
                                String tipo_dato_campo = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);

                                if( tipo_dato_campo.equals("varchar") )
                                {
                                    nombre_tabla_ident = nombre_tabla;
                                    nombre_campo_ident = tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length());
                                    /*
                                     * AQUI GENERA LA TABLA PARA ESTE OPERADOR
                                     */
                                }
                                else
                                {
                                    lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "LOS TIPOS DE DATOS NO CORRESPONDEN"));
                                }
                            }
                            else
                            {
                                lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN DELETE"));
                            }
                        }
                        else
                        {
                            lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "UN IDENTIFICADOR EN WHERE DEBE TENER A LO MAS UN PUNTO"));
                        }
                    }
                    else
                    {
                        /*
                         * ERROR
                         */
                    }
                    if(nombre_tabla_ident != null && nombre_campo_ident != null )
                    {
                        Igual obj_igual = new Igual(tabla_obj_query);
                        nodo.setMatriz_query(obj_igual.generarMatrizIgualIdentConstCad(new ObjetoQuery(nombre_tabla_ident, nombre_campo_ident, null)
                                                                , const_cad));
                    }
                    else
                    {
                        lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN DELETE"));
                    }

                }

                else if( (((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 4
                        && ((Lexema)nodo.getDerecha().getElement()).getTipo_lexema() == 6)
                     || (((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 6
                        && ((Lexema)nodo.getDerecha().getElement()).getTipo_lexema() == 4)
                        )
                {
                /*
                 * NOTA: ACA SE DEBE VERIFICAR SI EL CAMPO ES UN NUMERO
                 */
                    String nombre_tabla_ident = null;
                    String nombre_campo_ident = null;
                    double const_num;

                    if( ((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 4 )
                    {
                        tabla_campo = ((Lexema)nodo.getIzquierda().getElement()).getLexema();
                        const_num = Double.parseDouble(((Lexema)nodo.getDerecha().getElement()).getLexema());
                    }
                    else
                    {
                        tabla_campo = ((Lexema)nodo.getDerecha().getElement()).getLexema();
                        const_num = Double.parseDouble(((Lexema)nodo.getIzquierda().getElement()).getLexema());
                    }

                    if( buscarPuntoCadena(tabla_campo) == 0 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo) == 1)
                        {
                            String nombre_tabla = obj_opera_en_xml.buscarTablaDeCampo(nodo_update, tabla_campo);

                            if( !nombre_tabla.equals("") )
                            {
                                String tipo_dato_campo = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);

                                if( tipo_dato_campo.equals("double") )
                                {
                                    nombre_tabla_ident = nombre_tabla;
                                    nombre_campo_ident = tabla_campo;
                                }
                                else
                                {
                                    lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "LOS TIPOS DE DATOS NO CORRESPONDEN"));
                                }
                            }
                            else
                            {
                                lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN DELETE"));
                            }
                        }
                        else
                        {
                            lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN DELETE O EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN DELETE"));
                        }
                    }
                    else if( buscarPuntoCadena(tabla_campo) == 1 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                    , tabla_campo.substring(0, tabla_campo.indexOf('.'))) == 1)
                        {
                            String nombre_tabla = tabla_campo.substring(0, tabla_campo.indexOf('.'));
                            if( !nombre_tabla.equals("") )
                            {
                                String tipo_dato_campo = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);

                                if( tipo_dato_campo.equals("double") )
                                {
                                    nombre_tabla_ident = nombre_tabla;
                                    nombre_campo_ident = tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length());
                                    /*
                                     * AQUI GENERA LA TABLA PARA ESTE OPERADOR
                                     */
                                }
                                else
                                {
                                    lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "LOS TIPOS DE DATOS NO CORRESPONDEN"));
                                }
                            }
                            else
                            {
                                lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN DELETE"));
                            }
                        }
                        else
                        {
                            lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN DELETE O EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN DELETE"));
                        }
                    }
                    else
                    {
                        lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "UN IDENTIFICADOR EN WHERE DEBE TENER A LO MAS UN PUNTO"));
                    }
                    if(nombre_tabla_ident != null && nombre_campo_ident != null )
                    {
                        Igual obj_igual = new Igual(tabla_obj_query);
                        nodo.setMatriz_query(obj_igual.generarMatrizIgualIdentConstNum(new ObjetoQuery(nombre_tabla_ident, nombre_campo_ident, null)
                                                                , const_num));
                    }
                    else
                    {
                        lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN DELETE"));
                    }

                }
                else if( ((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 4
                        && ((Lexema)nodo.getDerecha().getElement()).getTipo_lexema() == 4 )
                {
                    /*
                     * NOTA: ACA SE DEBE VERIFICAR SI LOS DOS IDENTIFICADORES SON DEL MISMO TIPO DE DATO
                     */
                    String tipo_dato_nodo_izquierdo = "";
                    String tipo_dato_nodo_derecho = "";
                    String nombre_tabla_izq = null;
                    String nombre_tabla_der = null;
                    String nombre_campo_izq = null;
                    String nombre_campo_der = null;

                    tabla_campo = ((Lexema)nodo.getIzquierda().getElement()).getLexema();

                    if( buscarPuntoCadena(tabla_campo) == 0 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo) == 1)
                        {
                            String nombre_tabla = obj_opera_en_xml.buscarTablaDeCampo(nodo_update, tabla_campo);

                            if( !nombre_tabla.equals("") )
                            {
                                tipo_dato_nodo_izquierdo = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);

                                nombre_tabla_izq = nombre_tabla;
                                nombre_campo_izq = tabla_campo;
                            }
                            else
                            {
                                lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN DELETE"));
                            }
                        }
                        else
                        {
                            lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN DELETE O EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN DELETE"));
                        }
                    }
                    else if( buscarPuntoCadena(tabla_campo) == 1 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                    , tabla_campo.substring(0, tabla_campo.indexOf('.'))) == 1)
                        {
                            String nombre_tabla = tabla_campo.substring(0, tabla_campo.indexOf('.'));
                            if( !nombre_tabla.equals("") )
                            {
                                tipo_dato_nodo_izquierdo = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);

                                nombre_tabla_izq = nombre_tabla;
                                nombre_campo_izq = tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() );
                            }
                            else
                            {
                                lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN DELETE"));
                            }
                        }
                        else
                        {
                            lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN DELETE O EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN DELETE"));
                        }
                    }
                    else
                    {
                        lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "UN IDENTIFICADOR EN WHERE DEBE TENER A LO MAS UN PUNTO"));
                    }

                    tabla_campo = ((Lexema)nodo.getDerecha().getElement()).getLexema();

                    if( buscarPuntoCadena(tabla_campo) == 0 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo) == 1)
                        {
                            String nombre_tabla = obj_opera_en_xml.buscarTablaDeCampo(nodo_update, tabla_campo);

                            if( !nombre_tabla.equals("") )
                            {
                                tipo_dato_nodo_derecho = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);

                                nombre_tabla_der = nombre_tabla;
                                nombre_campo_der = tabla_campo;
                            }
                            else
                            {
                                lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN DELETE"));
                            }
                        }
                        else
                        {
                            lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN DELETE O EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN DELETE"));
                        }
                    }
                    else if( buscarPuntoCadena(tabla_campo) == 1 )
                    {
                        if(obj_opera_en_xml.buscarCamposEnArbol(nodo_update, tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                    , tabla_campo.substring(0, tabla_campo.indexOf('.'))) == 1)
                        {
                            String nombre_tabla = tabla_campo.substring(0, tabla_campo.indexOf('.'));
                            if( !nombre_tabla.equals("") )
                            {
                                tipo_dato_nodo_derecho = obj_opera_en_xml.buscarTipoDatoDeCampo(nodo_update
                                                                    , tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() )
                                                                    , nombre_tabla);

                                nombre_tabla_der = nombre_tabla;
                                nombre_campo_der = tabla_campo.substring(tabla_campo.indexOf('.')+1, tabla_campo.length() );
                            }
                            else
                            {
                                lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EL NOMBRE DE TABLA NO EXISTE EN DELETE"));
                            }
                        }
                        else
                        {
                            lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "EXISTE DOS CAMPOS O MAS CAMPOS IGUALES EN LAS TABLAS DEFINIDAS EN FROM O EL CAMPO NO EXISTE EN LAS TABLAS DEFINIDAS EN DELETE"));
                        }
                    }
                    else
                    {
                        lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "UN IDENTIFICADOR EN WHERE DEBE TENER A LO MAS UN PUNTO"));
                    }

                    if( tipo_dato_nodo_derecho.equals(tipo_dato_nodo_izquierdo) )
                    {
                        /*
                         * EJECUTAR OPERADOR
                         */
                        Igual obj_igual = new Igual(tabla_obj_query);
                        nodo.setMatriz_query(obj_igual.generarMatrizIgualIdentificadores(new ObjetoQuery(nombre_tabla_izq, nombre_campo_izq, null)
                                                                  ,new ObjetoQuery(nombre_tabla_der, nombre_campo_der, null)) );
                    }
                    else
                    {
                        lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "LOS TIPOS DE DATOS NO COINCIDEN"));
                    }
                }
                else
                {
                    lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "UN OPERADOR DEBE ESTAR RODEADO DE IDENTIFICADORES"));
                }
            }
            else
            {
                lista_errores_eliminacion.add(new Error("CAMPOS WHERE", "UN OPERADOR DEBE ESTAR RODEADO DE IDENTIFICADORES"));
            }
        }
        else if(((Lexema)nodo.getElement()).getTipo_lexema() == 1 
                && ( ((Lexema)nodo.getElement()).getLexema().toLowerCase().equals("and")
                    || ((Lexema)nodo.getElement()).getLexema().toLowerCase().equals("or")) )
        {
            if(lista_errores_eliminacion.isEmpty())
            {
                if(nodo.getDerecha() != null && nodo.getIzquierda() != null
                   && ((Lexema)nodo.getDerecha().getElement()).getTipo_lexema() == 3
                   && (    ((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 3
                        || ((Lexema)nodo.getIzquierda().getElement()).getTipo_lexema() == 1) )
                {
                    if(((Lexema)nodo.getElement()).getLexema().toLowerCase().equals("and"))
                    {
                        And obj_and = new And(nodo.getIzquierda().getMatriz_query()
                                                , nodo.getDerecha().getMatriz_query());
                        obj_and.intersectarMatrices();
                        nodo.setMatriz_query(obj_and.intersectarMatrices());
                    }
                    else
                    {
                        Or obj_or = new Or(nodo.getIzquierda().getMatriz_query()
                                                , nodo.getDerecha().getMatriz_query());
                        nodo.setMatriz_query(obj_or.unirMatrices());
                    }
                }
            }
            
        }
        else if( ((Lexema)nodo.getElement()).getTipo_lexema() == 1
                &&  ((Lexema)nodo.getElement()).getLexema().toLowerCase().equals("where") )
        {
            tabla_obj_query = nodo.getIzquierda().getMatriz_query();
            /*
             * ERROR
             */
        }
        else
        {
            /*
             * ERROR
             */
        }
    }

    public int buscarPuntoCadena(String cadena)
    {
        int numero_repitencia_punto = 0;
        for(int i = 0; i<cadena.length(); i++)
        {
            if(cadena.charAt(i) == '.')
            {
                numero_repitencia_punto++;
            }
        }
        return numero_repitencia_punto;
    }

    public void recorrerSubArbolFromDelete(BTree nodo)
    {
        if( nodo.getIzquierda()!= null )
        {
            recorrerSubArbolFromDelete(nodo.getIzquierda());
        }
        if(nodo.getDerecha() != null)
        {
            recorrerSubArbolFromDelete(nodo.getDerecha());
        }
        if(((Lexema)nodo.getElement()).getTipo_lexema() == 4 )
        {
            if( nodo.getDerecha() == null && nodo.getIzquierda() == null)
            {
                Archivo carchivo = new Archivo();
                carchivo.LeerArchivo("archivos_usados/archivos_base_datos/archivos_definicion/"+
                    ((Lexema)nodo.getElement()).getLexema().toLowerCase()+"_def.xml");

                if( !carchivo.getContenido_archivo().isEmpty() )
                {
                    XML xml_ = new XML("archivos_usados/archivos_base_datos/archivos_definicion/"+
                        ((Lexema)nodo.getElement()).getLexema().toLowerCase()+"_def.xml");

                    lista_def_columnas = xml_.retornarListaCampos(((Lexema)nodo.getElement()).getLexema().toLowerCase());

                    xml_ = new XML("archivos_usados/archivos_base_datos/archivos_datos/"+
                        ((Lexema)nodo.getElement()).getLexema().toLowerCase()+"_dat.xml");
                    tabla_obj_query = xml_.leerArchivosDatos(((Lexema)nodo.getElement()).getLexema().toLowerCase());

                    imprimirMatriz(tabla_obj_query);
                }
                else
                {
                    lista_errores_eliminacion.add(new Error("BLOQUE FROM", "LA TABLA NO EXISTE"));
                }
            }
            else
            {
                lista_errores_eliminacion.add(new Error("BLOQUE FROM", "SOLO DEBE CONTENER UN IDENTIFICADOR DE TABLA"));
            }
        }
        else if( ((Lexema) nodo.getElement()).getTipo_lexema() == 1
                 && ((Lexema)nodo.getElement()).getLexema().toLowerCase().equals("from")
            )
        {
            if( !( ((Lexema)nodo.getDerecha().getElement()).getLexema() == null
                    && ((Lexema)nodo.getIzquierda().getElement()).getLexema() != null ))
            {
                lista_errores_eliminacion.add(new Error("BLOQUE FROM", "NO COMIENZA CON LA PALABRA FROM"));
            }

        }
        else
        {
            if( !(((Lexema) nodo.getElement()).getTipo_lexema() == 0 &&
                ((Lexema)nodo.getElement()).getLexema() == null) )
            {
                lista_errores_eliminacion.add(new Error("BLOQUE FROM", "LA SENTENCIA FROM ESTA MAL"));
            }
        }
    }

    /**
     * @return the lista_lexemas
     */
    public ArrayList getLista_lexemas() {
        return lista_lexemas;
    }

    /**
     * @param lista_lexemas the lista_lexemas to set
     */
    public void setLista_lexemas(ArrayList lista_lexemas) {
        this.lista_lexemas = lista_lexemas;
    }

}
